libobs_simple\sources\windows\sources/
mod.rs1use std::ffi::CStr;
2
3pub mod window_capture;
4use libobs_wrapper::{
5 impl_signal_manager, run_with_obs, runtime::ObsRuntime, sources::ObsSourceTrait,
6 unsafe_send::SmartPointerSendable, utils::ObsError,
7};
8pub use window_capture::{
9 WindowCaptureSource, WindowCaptureSourceBuilder, WindowCaptureSourceUpdater,
10};
11
12mod capture;
13pub use capture::*;
14
15pub mod game_capture;
16pub use game_capture::{
17 GameCaptureSource, GameCaptureSourceBuilder, GameCaptureSourceUpdater, ObsGameCaptureMode,
18 ObsGameCaptureRgbaSpace,
19};
20
21pub mod monitor_capture;
22pub use monitor_capture::{MonitorCaptureSourceBuilder, MonitorCaptureSourceUpdater};
23
24#[cfg(feature = "window-list")]
25pub use libobs_window_helper::{WindowInfo, WindowSearchMode};
26
27use crate::sources::ObsEitherSource;
28
29const AUDIO_SOURCE_TYPE: &CStr = c"wasapi_process_output_capture";
31pub(super) fn audio_capture_available(runtime: &ObsRuntime) -> Result<bool, ObsError> {
32 run_with_obs!(runtime, || unsafe {
33 !libobs::obs_get_latest_input_type_id(AUDIO_SOURCE_TYPE.as_ptr()).is_null()
35 })
36}
37
38impl_signal_manager!(|ptr: SmartPointerSendable<*mut libobs::obs_source>| unsafe {
39 libobs::obs_source_get_signal_handler(ptr.get_ptr())
41}, ObsHookableSourceSignals for *mut libobs::obs_source, [
42 "hooked": {struct HookedSignal {
43 title: String,
44 class: String,
45 executable: String;
46 POINTERS {
47 source: *mut libobs::obs_source_t,
48 }
49 }},
50 "unhooked": {struct UnhookedSignal {
51 POINTERS {
52 source: *mut libobs::obs_source_t,
53 }
54 }},
55]);
56
57pub trait ObsHookableSourceTrait {
58 fn source_specific_signals(&self) -> std::sync::Arc<ObsHookableSourceSignals>;
59}
60
61impl<
62 A: ObsHookableSourceTrait + ObsSourceTrait + Clone + 'static,
63 B: ObsHookableSourceTrait + ObsSourceTrait + Clone + 'static,
64 > ObsHookableSourceTrait for ObsEitherSource<A, B>
65{
66 fn source_specific_signals(&self) -> std::sync::Arc<ObsHookableSourceSignals> {
67 match self {
68 ObsEitherSource::Left(a) => a.source_specific_signals(),
69 ObsEitherSource::Right(b) => b.source_specific_signals(),
70 }
71 }
72}